package com.yc;

import dev.langchain4j.community.model.dashscope.QwenEmbeddingModel;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
import dev.langchain4j.store.embedding.EmbeddingSearchResult;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;


public class RAG_App2 {
    public static void main(String[] args) {
        ////////阶段一：向量化+向量数据库
        //1.向量模型
        QwenEmbeddingModel qwenEmbeddingModel = QwenEmbeddingModel.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .build();
        //2.向量数据库：clickhouse,es,milvus,chromadb,pinecone,weaviate
        InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore();
        //3.利用向量模型进行向量化，然后存储向量到向量数据库
        TextSegment textSegment1 = TextSegment.from("""
                预订钻戒:
                -通过我们的网站或APP预订,您可以轻松拥有一个个性化的钻戒,以表达您的情感和想法。
                -预订时需要全额付款.3天内包退换
                -确保个人信息(姓名，身份证号,手机号等)的准确性，因为更正可能会产生额外10元的费用.""");
        Embedding embedding1 = qwenEmbeddingModel.embed(textSegment1.text()).content();
        embeddingStore.add(embedding1,textSegment1);

        TextSegment textSegment2 = TextSegment.from("""
                取消预订:
                -最晚取消时间为发货前24小时前.
                -取消费用:普通钻戒 20元/件，钻石钻戒 30元/件.
                -退款将在7个工作日内处理""");
        Embedding embedding2 = qwenEmbeddingModel.embed(textSegment2.text()).content();
        embeddingStore.add(embedding2,textSegment2);

        /////////////////阶段二：匹配向量
        Embedding queryEmbedding = qwenEmbeddingModel.embed("退订需要手续费吗").content();
        //创建请求
        EmbeddingSearchRequest build = EmbeddingSearchRequest.builder()
                .queryEmbedding(queryEmbedding)
                .maxResults(1)     //返回最相似的两个
                .minScore(0.7)     //相似度阈值
                .build();
        //开始搜索
        EmbeddingSearchResult<TextSegment> result = embeddingStore.search(build);
        //输出结果
        result.matches().forEach(embeddingMatch -> {
            System.out.println(embeddingMatch.score()+"\t"+embeddingMatch.embedded().text());
        });
    }
}
